#include <stdio.h>  
#include <stdlib.h>
#include <time.h>
#include <iostream>

using namespace std;

#ifndef __LOG_LIB_HEAD__
#define __LOG_LIB_HEAD__
namespace clog{
    /*
     * 1: D - DEBUG
     * 2: T - TRACE
     * 3: i - INFO
     * 4: w - WARN
     * 5: e - ERROR
     * 6: f - FATAL
     * 7: OFF
     */
    extern int level;
    extern const char *strs[];
    extern const char *timeFormat;
    extern bool StartOfLine;
    extern char timBuf[1024];

    // void setLevel(int l);
    void getTime();
    void lineend();
    void setLevel(int l);
    template <typename T> void f(T s);
    template <typename T> void fl(T s);
    template <typename T> void e(T s);
    template <typename T> void el(T s);
    template <typename T> void w(T s);
    template <typename T> void wl(T s);
    template <typename T> void i(T s);
    template <typename T> void il(T s);
    template <typename T> void t(T s);
    template <typename T> void tl(T s);
    template <typename T> void d(T s);
    template <typename T> void dl(T s);

#ifndef __NO_LOG__

    template <typename T> void println(int level,T s){
        if(StartOfLine){
            getTime();
            printf("[%s][%s]", strs[level], timBuf);
        }
        cout << s << endl;
        StartOfLine = true;
    }

    template <typename T> void print(int level,T s){
        if (StartOfLine){
            getTime();
            printf("[%s][%s]", strs[level], timBuf);
            StartOfLine = false;
        }
        cout << s ;
    }



    template <typename T> void f(T s){
        if(level < 7){
            print(6, s);
        }
    }

    template <typename T> void fl(T s){
        if(level < 7){
            println(6, s);
        }
    }

    template <typename T> void e(T s){
        if(level < 6){
            print(5, s);
        }
    }

    template <typename T> void el(T s){
        if(level < 6){
            println(5, s);
        }
    }

    template <typename T> void w(T s){
        if(level < 5){
            print(4, s);
        }
    }

    template <typename T> void wl(T s){
        if(level < 5){
            println(4, s);
        }
    }

    template <typename T> void i(T s){
        if(level < 4){
            print(3, s);
        }
    }

    template <typename T> void il(T s){
        if(level < 4){
            println(3, s);
        }
    }

    template <typename T> void t(T s){
        if(level < 3){
            print(2, s);
        }
    }

    template <typename T> void tl(T s){
        if(level < 3){
            println(2, s);
        }
    }

    template <typename T> void d(T s){
        if(level < 2){
            print(1, s);
        }
    }

    template <typename T> void dl(T s){
        if(level < 2){
            println(1, s);
        }
    }
#else /* __NO_LOG__ */
    template <typename T> void f(T s){}
    template <typename T> void fl(T s){}
    template <typename T> void e(T s){}
    template <typename T> void el(T s){}
    template <typename T> void w(T s){}
    template <typename T> void wl(T s){}
    template <typename T> void i(T s){}
    template <typename T> void il(T s){}
    template <typename T> void t(T s){}
    template <typename T> void tl(T s){}
    template <typename T> void d(T s){}
    template <typename T> void dl(T s){}

#endif  /* __NO_LOG__ */

}

#endif
